package Thread;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;


import com.sun.org.apache.bcel.internal.generic.NEW;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

/**
 * @description:
 * @author: cyy
 **/
public class sublist {
    public static void main(String[] args) throws Exception {

        // 开始时间

        long start = System.currentTimeMillis();

        // 模拟数据

        List<String> list = new ArrayList<String>();

        for (int i = 1; i <= 50000; i++) {

            list.add(i + "");

        }

        // 每500条数据开启一条线程

        int threadSize = 10000;

        // 总数据条数

        int dataSize = list.size();

        // 线程数

        int threadNum = dataSize / threadSize + 1;

        // 定义标记,过滤threadNum为整数

        boolean special = dataSize % threadSize == 0;

        // 创建一个线程池

        ExecutorService exec = Executors.newFixedThreadPool(threadNum);


        // 定义一个任务集合

        List<Callable<JSONArray>> tasks = new ArrayList<Callable<JSONArray>>();

        Callable<JSONArray> task = null;

        List<String> cutList = null;


        List<JSONArray> jsonArray=new ArrayList();


        JSONArray jsonArray1=new JSONArray();

        // 确定每条线程的数据

        for (int i = 0; i < threadNum; i++) {

            if (i == threadNum - 1) {

                if (special) {

                    break;

                }

                cutList = list.subList(threadSize * i, dataSize);

            } else {

                cutList = list.subList(threadSize * i, threadSize * (i + 1));

            }

            // System.out.println("第" + (i + 1) + "组：" + cutList.toString());

            final List<String> listStr = cutList;

            task = new Callable<JSONArray>() {

                @Override
                public JSONArray call() throws Exception {
                   JSONArray json=new JSONArray();

                    for (int i=0;i<listStr.size();i++){
                        json.add(listStr.get(i));
                        //jsonArray1.add((listStr.get(i)));
                    }
                    //jsonArray.add(json);
                    System.out.println(Thread.currentThread().getName() + "线程：" + listStr);
                    System.out.println(Thread.currentThread().getName() + "json：" + json.size());
                    //System.out.println(Thread.currentThread().getName() + "jsonArray：" + jsonArray.size());
                    //System.out.println(Thread.currentThread().getName() + "jsonArray：" + jsonArray1.size());

                    return json;

                }

            };

            // 这里提交的任务容器列表和返回的Future列表存在顺序对应的关系
            tasks.add(task);

        }

        SynchronousQueue synchronousQueue=new SynchronousQueue<Runnable>();
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5,5,60,TimeUnit.SECONDS,synchronousQueue);


        java.util.List<Future<JSONArray>> results = exec.invokeAll(tasks);

        System.out.println("shitutuya:"+jsonArray.size());


        for (Future<JSONArray> future : results) {

            jsonArray.addAll(future.get());
            //System.out.println(future.get());

        }

        //System.out.println("shitutuya:"+jsonArray);

        // 关闭线程池
        exec.shutdown();

        System.out.println("线程任务执行结束");

        System.err.println("执行任务消耗了 ：" + (System.currentTimeMillis() - start) + "毫秒");

    }
}
